﻿using Interface.DAO;
using JMI_Nucleo.Classe;
using JMI_Nucleo.Enumerador;
using JMI_Nucleo.JMIProvider;
using OR;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Dao
{
    public class FuncaoSistemaDao : IFuncaoSistemaDao<mFuncaoSistema>
    {
        private mFuncaoSistema infoFuncaoSistema;
     
        public FuncaoSistemaDao()
        {
        }

        #region Comando SQL
        const string cmdInsertSQL = @"INSERT INTO administrativo.funcaosistema(datacadastro, empresa, usuario, dataalteracao, ativo, indice, 
                                        nome, nomeinterno, comentario)
                                      VALUES(@datacadastro, @empresa, @usuario, @dataalteracao, @ativo, @indice, 
                                        @nome, @nomeinterno, @comentario)";

        const string cmdUpdateSQL = @"UPDATE administrativo.funcaosistema SET dataalteracao=@dataalteracao, ativo=@ativo, 
                                        nome=@nome, nomeinterno=@nomeinterno, comentario=@comentario, usuario=@usuario ";

        const string cmdDeleteSQL = @"DELETE FROM administrativo.funcaosistema ";

        const string cmdSelectSQL = @"SELECT datacadastro, empresa, usuario, dataalteracao, ativo, indice, 
                                           nome, nomeinterno, comentario
                                      FROM administrativo.funcaosistema ";
        #endregion       

        #region Metodos Publicos
        bool IFuncaoSistemaDao<mFuncaoSistema>.Inserir(mFuncaoSistema infoFuncaoSistema)
        {
            bool sucesso = false;
            try
            {
                DbCommand _cmd = EngineBD.GetConexao.CreateCommand();

                _cmd.CommandType = CommandType.Text;
                _cmd.CommandText = cmdInsertSQL;
                GeraParametro(ref _cmd, infoFuncaoSistema, 1);
                _cmd.Prepare();

                sucesso = EngineBD.ExecuteNonQuery(_cmd);                
            }
            catch (Exception ex)
            {
                #region Grava log local
                mLog _info = new mLog();
                _info._TipoErro = TipoErro.Erro;
                _info.Mensagem = "Erro ao executar comando. " + ex.Message;
                _info.Metodo = " bool IFuncaoSistemaDao<mFuncaoSistema>.Inserir(mFuncaoSistema infoFuncaoSistema)";
                _info.StackTrace = ex.StackTrace;
                _info.Tabela = String.Empty;
                LogLocal.Info = _info;
                LogLocal.Gravar();
                #endregion
            }
            return sucesso;
        }
        bool IFuncaoSistemaDao<mFuncaoSistema>.Alterar(mFuncaoSistema infoFuncaoSistema)
        {
            bool sucesso = false;
            DbParameter p = null;
            string cmdSQL = String.Empty;

            try
            {
                DbCommand _cmd = EngineBD.GetConexao.CreateCommand();

                _cmd.CommandType = CommandType.Text;
                cmdSQL = cmdUpdateSQL;
                cmdSQL += "WHERE indice =@PAR_INDICE AND empresa =@PAR_EMPRESA";
                _cmd.CommandText = cmdSQL;
                
                GeraParametro(ref _cmd, infoFuncaoSistema, 2);

                p = _cmd.CreateParameter();
                p.ParameterName = "@PAR_INDICE";
                p.Value = infoFuncaoSistema.Indice;
                _cmd.Parameters.Add(p);

                p = _cmd.CreateParameter();
                p.ParameterName = "@PAR_EMPRESA";
                p.Value = infoFuncaoSistema.CodigoEmpresa;
                _cmd.Parameters.Add(p);

                _cmd.Prepare();

                sucesso = EngineBD.ExecuteNonQuery(_cmd);                
            }
            catch (Exception ex)
            {
                #region Grava log local
                mLog _info = new mLog();
                _info._TipoErro = TipoErro.Erro;
                _info.Mensagem = "Erro ao executar comando. " + ex.Message;
                _info.Metodo = "bool IFuncaoSistemaDao<mFuncaoSistema>.Alterar(mFuncaoSistema infoFuncaoSistema)";
                _info.StackTrace = ex.StackTrace;
                _info.Tabela = String.Empty;
                LogLocal.Info = _info;
                LogLocal.Gravar();
                #endregion
            }
            return sucesso;
        }
        bool IFuncaoSistemaDao<mFuncaoSistema>.Excluir(mFuncaoSistema infoFuncaoSistema)
        {
            bool sucesso = false;
            DbParameter p = null;
            string cmdSQL;

            try
            {
                DbCommand _cmd = EngineBD.GetConexao.CreateCommand();

                _cmd.CommandType = CommandType.Text;
                cmdSQL = cmdDeleteSQL;
                cmdSQL += "WHERE indice =@PAR_INDICE AND empresa =@PAR_EMPRESA";
                _cmd.CommandText = cmdSQL;

                p = _cmd.CreateParameter();
                p.ParameterName = "@PAR_INDICE";
                p.Value = infoFuncaoSistema.Indice;
                _cmd.Parameters.Add(p);

                p = _cmd.CreateParameter();
                p.ParameterName = "@PAR_EMPRESA";
                p.Value = infoFuncaoSistema.CodigoEmpresa;
                _cmd.Parameters.Add(p);

                _cmd.Prepare();

                sucesso = EngineBD.ExecuteNonQuery(_cmd);       
            }
            catch (Exception ex)
            {
                #region Grava log local
                mLog _info = new mLog();
                _info._TipoErro = TipoErro.Erro;
                _info.Mensagem = "Erro ao executar comando. " + ex.Message;
                _info.Metodo = "bool IFuncaoSistemaDao<mFuncaoSistema>.Excluir(int Indice, short Empresa)";
                _info.StackTrace = ex.StackTrace;
                _info.Tabela = String.Empty;
                LogLocal.Info = _info;
                LogLocal.Gravar();
                #endregion
            }
            return sucesso;
        }
        
        mFuncaoSistema IFuncaoSistemaDao<mFuncaoSistema>.GetFuncaoSistema(int Indice, short Empresa)
        {
            infoFuncaoSistema = new mFuncaoSistema();
            DbDataReader rd = null;
            DbCommand _cmd = null;
            DbParameter p = null;
            string cmdSQL;

            try
            {
                _cmd = EngineBD.GetConexao.CreateCommand();

                _cmd.CommandType = CommandType.Text;
                cmdSQL = cmdSelectSQL;
                cmdSQL += "WHERE indice =@PAR_INDICE AND empresa =@PAR_EMPRESA";
                _cmd.CommandText = cmdSQL;

                p = _cmd.CreateParameter();
                p.ParameterName = "@PAR_INDICE";
                p.Value = Indice;
                _cmd.Parameters.Add(p);

                p = _cmd.CreateParameter();
                p.ParameterName = "@PAR_EMPRESA";
                p.Value = Empresa;
                _cmd.Parameters.Add(p);

                rd = EngineBD.ExecuteDataReader(_cmd);

                if (rd.Read())
                    infoFuncaoSistema = GetRd(rd);

                return infoFuncaoSistema;
            }
            catch (Exception ex)
            {
                #region Grava log local
                mLog _info = new mLog();
                _info._TipoErro = TipoErro.Erro;
                _info.Mensagem = "Erro ao executar comando. " + ex.Message;
                _info.Metodo = "mFuncaoSistema IFuncaoSistemaDao<mFuncaoSistema>.GetUsuario(int Codigo, short Empresa)";
                _info.StackTrace = ex.StackTrace;
                _info.Tabela = String.Empty;
                LogLocal.Info = _info;
                LogLocal.Gravar();
                #endregion
            }
            finally
            {
                rd.Close();
            }
            return infoFuncaoSistema;
        }

        List<mFuncaoSistema> IFuncaoSistemaDao<mFuncaoSistema>.GetLista(short Empresa)
        {
            mFuncaoSistema infoFuncaoSistema;
            List<mFuncaoSistema> lst = new List<mFuncaoSistema>();
            DbDataReader rd = null;
            DbCommand _cmd = null;
            DbParameter p = null;
            string cmdSQL;

            try
            {
                _cmd = EngineBD.GetConexao.CreateCommand();

                _cmd.CommandType = CommandType.Text;
                cmdSQL = cmdSelectSQL;
                cmdSQL += "WHERE empresa =@PAR_EMPRESA ";

                cmdSQL += "ORDER BY nome";
                _cmd.CommandText = cmdSQL;

                p = _cmd.CreateParameter();
                p.ParameterName = "@PAR_EMPRESA";
                p.Value = Empresa;
                _cmd.Parameters.Add(p);

                rd = EngineBD.ExecuteDataReader(_cmd);

                while (rd.Read())
                {
                    infoFuncaoSistema = new mFuncaoSistema();
                    infoFuncaoSistema.Indice = Convert.ToInt32(rd["indice"]);
                    infoFuncaoSistema.Nome = rd["nome"].ToString();
                    infoFuncaoSistema.NomeInterno = rd["nomeinterno"].ToString();
                    infoFuncaoSistema.Comentario = rd["comentario"].ToString();
                    infoFuncaoSistema.DataCadastro = Convert.ToDateTime(rd["datacadastro"]);
                    infoFuncaoSistema.DataAlteracao = Convert.ToDateTime(rd["dataalteracao"]);
                    infoFuncaoSistema.Ativo = Convert.ToBoolean(rd["ativo"]);
                    infoFuncaoSistema.Usuario = Convert.ToInt16(rd["usuario"]);
                    lst.Add(infoFuncaoSistema);
                }
                return lst;
            }
            catch (Exception ex)
            {
                #region Grava log local
                mLog _info = new mLog();
                _info._TipoErro = TipoErro.Erro;
                _info.Mensagem = "Erro ao executar comando. " + ex.Message;
                _info.Metodo = "List<mFuncaoSistema> IFuncaoSistemaDao<mFuncaoSistema>.GetLista(short Empresa)";
                _info.StackTrace = ex.StackTrace;
                _info.Tabela = String.Empty;
                LogLocal.Info = _info;
                LogLocal.Gravar();
                #endregion
            }
            finally
            {
                rd.Close();
            }
            return lst;
        }
        #endregion

        #region Metodos privados
        private mFuncaoSistema GetRd(DbDataReader rd)
        {
            infoFuncaoSistema = new mFuncaoSistema();
            infoFuncaoSistema.Indice = Convert.ToInt32(rd["indice"]);
            infoFuncaoSistema.DataCadastro = Convert.ToDateTime(rd["datacadastro"]);
            infoFuncaoSistema.CodigoEmpresa = Convert.ToInt16(rd["empresa"]);
            infoFuncaoSistema.DataAlteracao = Convert.ToDateTime(rd["dataalteracao"]);
            infoFuncaoSistema.Ativo = Convert.ToBoolean(rd["ativo"]); 
            infoFuncaoSistema.Nome = rd["nome"].ToString();
            infoFuncaoSistema.NomeInterno = rd["nomeinterno"].ToString();
            infoFuncaoSistema.Comentario = rd["comentario"].ToString();

            return infoFuncaoSistema;
        }
        private void GeraParametro(ref DbCommand _cmd, mFuncaoSistema infoFuncaoSistema, byte Acao)
        {
            _cmd.Parameters.Clear();
            JMIUtil jmiUtil = new JMIUtil();

            if (Acao == 1)
            {
                infoFuncaoSistema.Indice = UtilBD.GetID(EngineBD.GetConexao, "administrativo.funcaosistema", "indice", infoFuncaoSistema.CodigoEmpresa);
                UtilBD.AdicionaParametro(ref _cmd, "@indice", infoFuncaoSistema.Indice);
                UtilBD.AdicionaParametro(ref _cmd, "@empresa", infoFuncaoSistema.CodigoEmpresa);
                UtilBD.AdicionaParametro(ref _cmd, "@datacadastro", infoFuncaoSistema.DataCadastro);
            }            
            UtilBD.AdicionaParametro(ref _cmd, "@dataalteracao", infoFuncaoSistema.DataAlteracao);
            UtilBD.AdicionaParametro(ref _cmd, "@ativo", infoFuncaoSistema.Ativo);
            UtilBD.AdicionaParametro(ref _cmd, "@nome", infoFuncaoSistema.Nome);
            UtilBD.AdicionaParametro(ref _cmd, "@nomeinterno", infoFuncaoSistema.NomeInterno);
            UtilBD.AdicionaParametro(ref _cmd, "@comentario", infoFuncaoSistema.Comentario);
            UtilBD.AdicionaParametro(ref _cmd, "@usuario", infoFuncaoSistema.Usuario);
        }
        #endregion
    }
}
